/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package analisador.lexico;

/**
 *
 * @author dem_danilo
 */
public class AnalisadorSemantico {
    
    TabelaSimbolos tab = new TabelaSimbolos();

    public AnalisadorSemantico() {
    }

    public void setTab(TabelaSimbolos tab) {
        this.tab = tab;
    }
    
    public void criarEscopo(){
        tab = tab.criarFilho();
    }
    
    public void removerEscopo(){
        printTabela();
        tab = tab.getPai();        
        if(tab != null)
            printTabela();
    }
    
    public void adicionarSimbolo(Registro reg){
        //if(tab.getSimbol(reg.getCadeia()) == null)
            tab.addSimbol(reg.getCadeia(), reg);
        //else
            //exception;
            
    }
    
    public void adicionarSimbolo(Registro reg, int linha) throws ExcecaoCompilador{
        if(!tab.getTabela().containsKey(reg.getCadeia()))
            tab.addSimbol(reg.getCadeia(), reg);
        else{
            
            //throw new ExcecaoCompilador
                     AnalisadorSintatico.msgErro += "Linha " + linha + ": identificador " + reg.getCadeia() + " ja declarado anteriormente\n";
        }
    }
    
    public Registro getSimbolo(String s){
        return tab.getSimbol(s);
    }
    
    public Registro getSimbolo(String s, int linha) throws ExcecaoCompilador{
        if(tab.getSimbol(s) == null){
            printTabela();
            //throw new ExcecaoCompilador
            AnalisadorSintatico.msgErro += "Linha " + linha + ": identificador " + s + " nao declarado\n";
        }
        return tab.getSimbol(s);
    }
    public void getInformacaoTipo(Registro r, String tipo, int linha) throws ExcecaoCompilador{
        Registro aux = getSimbolo(tipo);
        if(aux != null){
            r.setFilhoRegistro(aux.getFilhoRegistro());
            r.setPaiRegistro(aux.getPaiRegistro());
            r.setTipo(aux.getTipo());
        }
    }
    public boolean verificaTipos(Token tok, Registro reg){
        if(tok.equals("numero_" + reg.getTipo()) || tok.equals("cadeia_" + reg.getTipo()))
            return true;
        if((tok.equals("verdadeiro") || tok.equals("falso")) && reg.getTipo().equals("logico"))
            return true;

        Registro aux = tab.getSimbol(tok.getNome());
        return aux.getTipo().equals(reg.getTipo());
    }
    
    public TabelaSimbolos getPai(){
        return tab.getPai();
    }
    
    public void printTabela(){
        System.out.println("-----------> Imprimindo a tabela de simbolos <--------------");
        for(int o= 0; o < tab.getTabela().values().size(); o++)
            System.out.println(tab.getTabela().values().toArray()[o]);
        
        System.out.println("-----------> Fim a tabela de simbolos <--------------");
        System.out.println();
        System.out.println();
        
    }
}
